; void pixelar_asm (
; 	unsigned char *src, RDI
; 	unsigned char *dst, RSI
; 	int m, EDX
; 	int n, ECX
; 	int src_row_size, R8d
; 	int dst_row_size  R9d
; );

section .data

mascaraXmm: DQ 0000000000000000h
mascaraXmm2: DQ FFFFFFFFFFFFFFFFh

section .text

global pixelar_asm

pixelar_asm:

	push R12		; en R13 voy a guardar el salto de filas del src
	push R13		; en R12 voy a guardar el salto de filas del dst
	push R14		; en R14 voy a contar las columnas
	push R15		; en R15 voy a contar las filas
	push RBX		; en RBX es una suma provisoria de rdi + filas
	xor R14, R14		; R14 = 0
	xor R15, R15		; R15 = 0
	xor RAX, RAX		; RAX = 0
	mov EAX, R8d		; EAX = src_row_size
	xor R8, R8		; R8 = 0
	mov R8, RAX		; R8 = src_row_size
	mov EAX, R9d		; EAX = dst_row_size
	xor R9, R9		; R9 = 0
	mov R9, RAX		; R9 = dst_row_size
	mov R12, R8		; pongo la longitud de fila de src en R12
	add R12, R8		; lo "multiplico" x3
	add R12, R8		;  " ; evito perder RDX de esta manera
	mov R13, R9		; pongo la longitud de fila de dst en R13
	add R13, R9		; lo "multiplico" x3
	add R13, R9		;  " ; evito perder RDX de esta manera
				; en XMM7 voy a ir guardando el promedio

.ciclo_filas:

	.ciclo_columnas:

		; TRABAJO DE A TRAMOS DE 4 FILAS, VOY A TOMAR POR CADA FILA DE A 8 BYTES

		; LEVANTO DEL SRC 8 BYTES DE ESTE TRAMO DE FILAS
		xor RBX, RBX			; RBX = 0
		movq XMM0, [RDI+RBX]		
		add RBX, R8
		movq XMM1, [RDI+RBX]
		add RBX, R8
		movq XMM2, [RDI+RBX]
		add RBX, R8
		movq XMM3, [RDI+RBX]
		; FIN LEVANTO DEL SRC 8 BYTES DE ESTE TRAMO DE FILAS

		pxor XMM4, XMM4			; XMM4 = 0
		punpcklbw XMM0, XMM4		; 0|x7|0|x6|0|x5|0|x4|0|x3|0|x2|0|x1|0|x0|
						; dato 1 = 0|x7|0|x6|0|x5|0|x4|, dato2 = x3|0|x2|0|x1|0|x0|
		pxor XMM4, XMM4			; XMM4 = 0
		punpcklbw XMM1, XMM4		; 0|x7|0|x6|0|x5|0|x4|0|x3|0|x2|0|x1|0|x0|
						; dato 1 = 0|x7|0|x6|0|x5|0|x4|, dato2 = x3|0|x2|0|x1|0|x0|
		pxor XMM4, XMM4			; XMM4 = 0
		punpcklbw XMM2, XMM4		; 0|x7|0|x6|0|x5|0|x4|0|x3|0|x2|0|x1|0|x0|
						; dato 1 = 0|x7|0|x6|0|x5|0|x4|, dato2 = x3|0|x2|0|x1|0|x0|
		pxor XMM4, XMM4			; XMM4 = 0
		punpcklbw XMM3, XMM4		; 0|x7|0|x6|0|x5|0|x4|0|x3|0|x2|0|x1|0|x0|
						; dato 1 = 0|x7|0|x6|0|x5|0|x4|, dato2 = x3|0|x2|0|x1|0|x0|

		; al momento tengo en XMM0/1/2/3 H las 4 filas del dato1 y en XMM0/1/2/3 L las 4 filas del dato2

		paddw XMM0, XMM1			; sumo las filas 1 con 2
		paddw XMM0, XMM2			; sumo las filas 1 y 2 con 3
		paddw XMM0, XMM3			; sumo las filas 1 y 2 y 3 con 4

		; al momento en XMM0 H tengo las sumas verticales del dato1 y en XMM0 L tengo las sumas verticales del dato2
		
		;movdqu XMM1, XMM0		; copio los datos a XMM1
		;psrlw XMM1, 1
		;paddw XMM0, XMM1
		;movdqu XMM1, XMM0
		;psrlw XMM1, 3
		;paddw XMM0, XMM1

		psrlw, 16

		;movdqu XMM1, XMM0
		;psllw XMM1, 1
		;paddb XMM0, XMM1
		;movdqu XMM1, XMM0
		;psllw XMM1, 2
		;paddb XMM0, XMM1				

		packuswb XMM0, XMM0
		movdqu XMM0, mascaraXmm
	
		; SETEO EN EL DST 8 BYTES DE ESTE TRAMO DE FILAS
		xor RBX, RBX			; RBX = 0
		movq [RSI], mascaraXmm2;XMM0
		add RBX, R9
		movq [RSI+RBX], mascaraXmm2;XMM0
		add RBX, R9
		movq [RSI+RBX], mascaraXmm2;XMM0
		add RBX, R9
		movq [RSI+RBX], mascaraXmm2;XMM0


		; FIN SETEO EN EL DST 8 BYTES DE ESTE TRAMO DE FILAS

		add RDI, 8
		add RSI, 8
		add R14d, 8
		cmp R14d, ECX
		jl .ciclo_columnas 
	.fin_ciclo_columnas:
	
	add RDI, R12
	add RSI, R13	
	xor R14, R14
	add R15d, 4
	cmp R15d, EDX
	jl .ciclo_filas
.fin_ciclo_filas:

	


.fin:
	pop RBX
	pop R15
	pop R14
	pop R13
	pop R12
	ret

